package com.bood.shimmer.modules.demo.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bood.shimmer.common.annotation.AutoIdempotent;
import com.bood.shimmer.common.api.Result;
import com.bood.shimmer.common.utils.NetUtils;
import com.bood.shimmer.modules.demo.model.Users;
import com.bood.shimmer.modules.demo.service.UsersService;
import com.bood.shimmer.shiro.JwtToken;
import com.bood.shimmer.shiro.JwtUtil;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

/**
 * <p>
 * 用户 前端控制器
 * </p>
 *
 * @author bood
 * @since 2020-11-14
 */
@RestController
@RequestMapping("/demo/test")
public class TestController {

    @Resource
    private UsersService usersService;
    @Resource
    private JwtUtil jwtUtil;


    /****************************************** crud ****************************************************/

    /**
     * <p>
     * 获取用户列表
     * </p>
     *
     * @return：com.bood.common.api.Result
     * @author：bood
     * @date：2020/11/30
     */
    @GetMapping("/list")
    public Result list() {
        return Result.ok(usersService.list());
    }

    /**
     * <p>
     * 添加用户信息（自动填充 创建时间）
     * </p>
     *
     * @param users: 用户信息 Json
     * @return：com.bood.common.api.Result
     * @author：bood
     * @date：2020/11/30
     */
    @PostMapping("/add")
    public Result add(@RequestBody Users users) {
        return Result.or(usersService.save(users));
    }

    /**
     * <p>
     * 更新用户信息（自动填充 更新时间）
     * </p>
     *
     * @param users: 用户信息 Json
     * @return：com.bood.common.api.Result
     * @author：bood
     * @date：2020/11/30
     */
    @PutMapping("/update")
    public Result update(@RequestBody Users users) {
        return Result.or(usersService.updateById(users));
    }

    /**
     * <p>
     * 根据用户 ID 删除用户信息（逻辑删除）
     * </p>
     *
     * @param id: 用户 ID
     * @return：com.bood.common.api.Result
     * @author：bood
     * @date：2020/11/30
     */
    @DeleteMapping("/del/{id}")
    public Result del(@PathVariable("id") String id) {
        return Result.or(usersService.removeById(id));
    }

    /**
     * <p>
     * 根据用户 ID 获取用户信息
     * </p>
     *
     * @param id: 用户 ID
     * @return：com.bood.common.api.Result
     * @author：bood
     * @date：2020/11/30
     */
    @GetMapping("/getById")
    public Result getById(@RequestParam("id") String id) {
        return Result.ok(usersService.getById(id));
    }

    /****************************************** 分页 ****************************************************/

    /**
     * <p>
     * 获取用户列表（分页数据）
     * </p>
     *
     * @param page:     页码
     * @param pageSize: 页条数
     * @return：com.bood.common.api.Result
     * @author：bood
     * @date：2020/11/30
     */
    @GetMapping("/page")
    public Result page(@RequestParam("page") int page, @RequestParam("pageSize") int pageSize) {
        Page<Users> usersPage = new Page<>(page, pageSize);
        IPage<Users> usersIPage = usersService.page(usersPage);
        return Result.ok(usersIPage);
    }

    /****************************************** 模拟多数据源操作  ****************************************************/

    /**
     * <p>
     * 模拟多数据源操作，并验证 Spring 事务配置
     * master 写
     * salve1 写
     * salve2 写，by zero 异常
     * </p>
     *
     * @param id: 用户 ID
     * @param name: 用户姓名
     * @return: com.bood.shimmer.common.api.Result
     * @author: bood
     * @date: 2020/12/5
     */
    @PutMapping("/update/user/{id}/{name}")
    public Result updateUserName(@PathVariable("id") String id, @PathVariable("name") String name) {
        Users users = new Users();
        users.setId(id);
        users.setName(name);

        return Result.or(usersService.updateMaster(users), usersService.updateSalve1(users), usersService.updateSalve2(users));
    }

    /****************************************** Token ****************************************************/
    @AutoIdempotent
    @GetMapping("/getToken")
    public Result<String> getToken(HttpServletRequest request) throws Exception {
        JwtToken jwtToken = new JwtToken();
        jwtToken.setId("001");
        jwtToken.setIp(NetUtils.ipToInteger(NetUtils.getIpAddress(request)));

        return Result.ok(jwtUtil.createToken(jwtToken));
    }

}

